package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * 通过反射机制来调用方法
 */
public class ReflectDemo4 {
    public static void main(String[] args) throws Exception {
        //普通方式调用sayHello方法
        /*
        Person p = new Person();
        p.sayHello();
        */

        //反射方式调用sayHello方法
        /*
        Class cls =Class.forName("reflect.Person");//1.实例化Class类对象
        Object obj = cls.newInstance(); //2.调用无参构造方法实例化person对象, 相当于: Person obj = new Person();
        Method method = cls.getMethod("sayHello");//3.通过类对象来获取sayHello方法
        method.invoke(obj);//4.通过方法对象的invoke来调用方法, 传入的参数为方法的所属对象, 相当于: obj.sayHello(); obj内没有sayHello方法, 但是通过反射可以获得sayHello方法, 并调用
         */

        //动态绑定
        Scanner scan = new Scanner(System.in);//创建一个扫描器
        System.out.println("请输入类名:");//提示输入类名
        String className = scan.nextLine();//获取用户输入的类名
        System.out.println("请输入方法名:");//提示输入方法名
        String methodName = scan.nextLine();//获取用户输入的方法名

        Class cls = Class.forName(className);//1.实例化Class类对象
        Constructor c = cls.getConstructor(String.class);//2.通过class对象, 调用有参构造方法
        Object obj = c.newInstance("张三");//3.通过有参构造方法传参后实例化对象
        Method method = cls.getMethod(methodName);//4.通过类对象来获取方法
        method.invoke(obj);//5.通过方法对象的invoke来调用方法


    }
}
